/*
 * @Author      : ZhouQiJun
 * @Date        : 2025-08-09 16:45:29
 * @LastEditors : ZhouQiJun
 * @LastEditTime: 2025-08-10 19:27:05
 * @Description : 监听地图事件
 */
import { getGis } from '@ol/api'
import { Event, type GisKey, KEY, Platform } from '@ol/define'
import { type Attachment, type FeatureT, type OnEvent, olBindMapEvents } from '@ol/platform'
import { isNil } from 'es-toolkit'

export { type FeatureT, type Attachment }
/**
 * 监听地图事件（OpenLayers 或 Cesium）。
 *
 * @param types - 要监听的事件类型，可以是单个事件名称或事件名称数组。
 * @param onEvent - 事件回调函数，当事件触发时调用。
 * @param key - GIS 实例的唯一标识，默认为 `KEY`。
 * @param platform - 平台类型，支持 `Platform.OL`（OpenLayers）和 `Platform.CE`/`Platform.CESIUM`（Cesium），默认为 `Platform.OL`。
 * @returns
 * - 如果 `gis.map` 不存在，返回 `null`
 * - 对于 OpenLayers 平台，返回由 `olBindMapEvents` 创建的事件解绑函数
 * - 对于 Cesium 平台，目前返回 `null`（TODO: 待实现）
 *
 * @example
 * ```ts
 * const clearMapEvents = setupEvents('click', (event) => {
 *   console.log('地图点击事件', event)
 * })
 *
 * // 取消监听
 * clearMapEvents?.()
 * ```
 */
export default function setupEvents(
  types: Event,
  onEvent: OnEvent,
  key: GisKey = KEY,
  platform = Platform.OL,
) {
  const gis = getGis(key)
  if (isNil(gis?.map)) return null
  if (['ce', 'cesium'].includes(platform)) {
    // cesium 事件
    // TODO
    return null
  }
  const map = getGis(key).map!
  return olBindMapEvents(types, onEvent, map)
}
